# !/usr/bin/env Python
# -*- coding: utf-8 -*-
import glob
import hashlib
import os
import re
import shutil
import sys
import time

decode = 'utf-8'

ICTCLAS = {
    'Ag': '形语素', 'a': '形容词', 'ad': '副形词', 'an': '名形词', 'b': '区别词', 'c': '连词', 'Dg': '副语素', 'd': '副词', 'e': '叹词',
    'f': '方位词', 'g': '语素', 'h': '前接成分', 'i': '成语', 'j': '简称略语', 'k': '后接成', 'l': '习用语', 'm': '数词', 'Ng': '名语素',
    'n': '名词', 'nr': '人名', 'ns': '地名', 'nt': '机构团体', 'nz': '其他专名', 'o': '拟声词', 'p': '介词', 'q': '量词', 'r': '代词',
    's': '处所词', 'Tg': '时语素', 't': '时间词', 'u': '助词', 'Vg': '动语素', 'v': '动词', 'vd': '副动词', 'vn': '名动词', 'w': '标点符',
    'x': '非语素字', 'y': '语气词', 'z': '状态词', 'ag': '形语素', 'B': '区别词', 'dg': '副语素', 'ng': '名语素', 'nx': '字母专名', 'tg': '时语素',
    'ud': '结构助词', 'ug': '时态助词', 'uj': '结构助词的', 'ul': '时态助词了', 'uv': '结构助词地', 'uz': '时态助词着', 'vg': '动语素', 'Bg': '区别语素',
    'Mg': '数语素', 'Yg': '语气语素', 'al': '形容词性惯用语', 'begin': '仅用于始##始', 'bg': '区别语素', 'bl': '区别词性惯用语', 'cc': '并列连词',
    'dl': '连语', 'end': '仅用于终##终', 'gb': '生物相关词汇', 'gbc': '生物类别', 'gc': '化学相关词汇', 'gg': '地理地质相关词汇', 'gi': '计算机相关词汇',
    'gm': '数学相关词汇', 'gp': '物理相关词汇', 'mg': '数语素', 'mq': '数量词', 'nb': '生物名', 'nba': '动物名', 'nbc': '动物纲目', 'nbp': '植物名',
    'nf': '食品', 'nh': '医药疾病等健康相关名词', 'nhd': '疾病', 'nhm': '药品', 'ni': '机构相关（不是独立机构名）', 'nic': '下属机构', 'nis': '机构后缀',
    'nit': '教育相关机构', 'nl': '名词性惯用语', 'nm': '物品名', 'nmc': '化学品名', 'nn': '工作相关名词', 'nnd': '职业', 'nnt': '职务职称',
    'nr1': '复姓', 'nr2': '蒙古姓名', 'nrf': '音译人名', 'nrj': '日语人名', 'nsf': '音译地名', 'ntc': '公司名', 'ntcb': '银行', 'ntcf': '工厂',
    'ntch': '酒店宾馆', 'nth': '医院', 'nto': '政府机构', 'nts': '中小学', 'ntu': '大学', 'pba': '介词“把”', 'pbei': '介词“被”',
    'qg': '量词语素', 'qt': '时量词', 'qv': '动量词', 'rg': '代词性语素', 'Rg': '古汉语代词性语素', 'rr': '人称代词', 'ry': '疑问代词',
    'rys': '处所疑问代词', 'ryt': '时间疑问代词', 'ryv': '谓词性疑问代词', 'rz': '指示代词', 'rzs': '处所指示代词', 'rzt': '时间指示代词',
    'rzv': '谓词性指示代词', 'ude1': '的 底', 'ude2': '地', 'ude3': '得', 'udeng': '等 等等 云云', 'udh': '的话', 'uguo': '过',
    'ule': '了 喽', 'ulian': '连', 'uls': '来讲,来说,而言,说来', 'usuo': '所', 'uyy': '一样,一般,似的,般', 'uzhe': '着', 'uzhi': '之',
    'vf': '趋向动词', 'vi': '不及物动词（内动词）', 'vl': '动词性惯用语', 'vshi': '动词“是”', 'vx': '形式动词', 'vyou': '动词“有”', 'wb': '百分号千分号',
    'wd': '逗号', 'wf': '分号', 'wh': '单位符号', 'wj': '句号', 'wky': '右括号', 'wkz': '左括号', 'wm': '冒号', 'wn': '顿号', 'wp': '破折号',
    'ws': '省略号', 'wt': '叹号', 'ww': '问号', 'wyy': '右引号', 'wyz': '左引号', 'xu': '网址URL', 'xx': '非语素字', 'yg': '语气语素',
    'df': '副词', 'nrfg': '人名', 'nrt': '人名', 'vq': '名动词', 'zg': '状态词', 'eng': '英文'
}


def get_tar(base_path):
    import tarfile

    base_path = base_path.encode(decode)
    # 创建压缩包名
    tar = tarfile.open("%s.tar.gz" % base_path, "w:gz")
    # 创建压缩包
    for root_path, _dir, files in os.walk(base_path):
        for file_name in files:
            full_path = os.path.join(root_path, file_name)
            tar.add(full_path)
    tar.close()
    if os.path.exists(base_path):
        shutil.rmtree(base_path)


def format_content(content, _filter):
    """
    过滤正文

    :param content: 正文源文本
    :param _filter: 正则规则
    [
        ('.*（网络图片） 【看中国\d{4}年\d{0,2}月\d{0,2}日讯】（看中国记者.{0,10}综合报导）', ''),
        ('.* - .{0,20} - 看中国网\d{4}/\d{0,2}/\d{0,2} \d{0,2}:\d{0,2}:\d{0,2}(.{0,10}（看中国配图/网络图片）)?', ''),
        ('（网络图片）', ''),
        ('（看中国记者.{0,10}综合报导）', ''),
        ('【看中国\d{4}年\d{0,2}月\d{0,2}日讯】', '')
        ('.{0,100}（.{0,200}）', ''),
        ('.{0,100}\(.{0,20}\)', '')
        ('【大纪元\d{4}年\d{0,2}月\d{0,2}日讯】', '')
    ]
    :return: 过滤后正文
    """
    for pat, new_pat in _filter:
        if re.match(pat + '.*', content):
            content = re.sub(pat, new_pat, content)
    return content


def get_time_str():
    return "{0}-{1}-{2}--{3}-{4}-{5}".format(*time.localtime(time.time()))


def get_md5(_str):
    return hashlib.md5(_str.encode('utf-8')).hexdigest()


def sys_print(s):
    output = sys.stdout
    output.write(s)
    output.flush()


def get_all_file_paths(path, ex=['.txt']):
    file_paths = []
    for dir_path, dir_names, file_names in os.walk(path):
        for file_name in file_names:
            file_path = '%s%s%s' % (dir_path, os.sep, file_name)
            # print file_path, glob.glob(file_path), file_path[-len(ex):].lower()
            if glob.glob(file_path) and os.path.splitext(file_path)[1].lower() in ex:
                file_paths.append(file_path)
                # print(file_path)
    return file_paths


def get_str(line, code):
    """try_decode"""
    if isinstance(line, bytes):
        return str(line.decode(code))
    elif isinstance(line, str):
        return line
    else:
        raise Exception('数据格式不对%s' % line)


def get_bytes(line, code):
    """try_encode"""
    if isinstance(line, bytes):
        return line
    elif isinstance(line, str):
        return line.encode(code)
    else:
        raise Exception('数据格式不对%s' % line)


def get_process(process, all_len):
    process = process * 1.0
    all_len = all_len * 1.0
    output = sys.stdout
    output.write('\r已完成[%s%s] %.2f%%\r' % (
        u'\u2588' * int(process / all_len * 40),
        '-' * int((all_len - process) / all_len * 40), process / all_len * 100))
    output.flush()
